// generator和函数不同的是，generator由function*定义（注意多出的*号），并且，除了return语句，还可以用yield返回多次。
// 通过function*来定义的函数称之为“生成器函数”（generator function），它的特点是可以中断函数的执行，每次执行yield语句之后，函数即暂停执行，
// 直到调用返回的生成器对象的next()函数它才会继续执行。

// 还有其它细节

// https://www.jianshu.com/p/92639e681e2a
let compute = function* (a, b) {
    let sum = a + b;
    yield console.log(sum);
    let c = a - b;
    yield console.log(c);
    let d = a * b;
    yield console.log(d);
    let e = a / b;
    console.log(e);
};


// var compute = function* (a, b) {
//     let sum = a + b;
//     yield sum;
//     let c = a - b;
//     yield c;
//     let d = a * b;
//     yield d;
//     let e = a / b;
//     e;
// };
// 执行一下这个函数得到 Generator 实例
let generator = compute(4, 2);
// 要使得函数中封装的代码逻辑得到执行，还得需要调用一次next方法。    至少得调用两次
generator.next();
// generator.next();
// generator.next();
// generator.next();







console.log('---------------廖雪峰————————————————————————')
// 以下是廖雪峰的
function* foo() {
    yield x + 1;
    yield x + 2;
    yield x + 3;
}
console.log(foo());

function fib(max) {
    var
        t,     // 此处t用来干嘛？
        a = 0,
        b = 1,
        arr = [0, 1];
    while (arr.length < max) {
        [a, b] = [b, a + b];
        arr.push(b);
    }
    console.log(arr);
    return arr;
}


function* fib2(max) {
    var
        t,
        a = 0,
        b = 1,
        n = 0;
    while (n < max) {
        yield a;
        [a, b] = [b, a + b];
        n++;
    }
    return;
}

// 测试:
fib(5); // [0, 1, 1, 2, 3]
fib(10); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
var f = fib2(5);
f.next(); // {value: 0, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 2, done: false}
f.next(); // {value: 3, done: false}
f.next(); // {value: undefined, done: true}
console.log(f);